package jp.co.toshiba.ffsa.service.csas;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import jp.co.toshiba.ffsa.common.MakeHash;
import jp.co.toshiba.ffsa.entity.User;
import jp.co.toshiba.ffsa.mail.SendMaiMail;
import jp.co.toshiba.ffsa.service.common.CommonService;
import jp.co.toshiba.ffsa.service.common.ConstantValue;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.mai.mail.MailAddress;
import org.seasar.struts.util.MessageResourcesUtil;

import com.ozacc.mail.MailSendException;

/**
 *登録入力確認Serviceクラス
 * @author npc
 */
public class Csas103Service {
    /** メールアドレス */
    private String emailAddress;
    /** パスワード */
    private String password;
    /** firstName */
    private String firstName;
    /** lastName */
    private String lastName;
    /** userID */
    private String userID;
    /** Company */
    private String company;
    /** Department */
    private String department;
    /** Phone */
    private String phone;
    /** Region */
    private String region;
    /** Country */
    private String country;
    /** City */
    private String city;
    /** ユーザーマスタ */
    private User user = null;
    /** エラーコード */
    private String errorCode;

    /**
     * DB操作処理
     * @throws Exception エラー
     */
    public Boolean userRegInfo( ) throws Exception {
        String strCheck = "";
        strCheck = this.checkUserPresence();
        try{
            // 対象データがない時
            if("2".equals(strCheck)){
                // データ新規
                insertRegInfo();
                return true;
                // 対象データが存在し仮ユーザーである時
            } else if("0".equals(strCheck)) {
                updateRegInfo();
                return true;
                // 対象データが存在し本ユーザーである時
            } else {
                this.errorCode = "csas103.901";
                return false;
            }
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * INSERT処理
     * @throws Exception エラー
     */
    public void insertRegInfo( ) throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // ユーザーIDゲット
            getUserIdSequence();
            // 当日取得
            Calendar cal = Calendar.getInstance();
            Timestamp timSystime = new Timestamp(cal.getTime().getTime());

            // パラメータ値設定
            User param = new User();
            param.userID                = this.userID;
            param.mailAddress           = this.emailAddress;
            param.password              = MakeHash.getSha256HashCode(this.password);
            param.passwordUpdateAt      = timSystime;
            param.firstName             = this.firstName;
            param.lastName              = this.lastName;
            param.region                = this.region;
            param.company               = this.company;
            param.department            = this.department;
            param.phone                 = this.phone;
            param.country               = this.country;
            param.city                  = this.city;
            param.updatedBy             = this.userID;
            param.updatedAt             = timSystime;
            param.createdBy             = this.userID;
            param.createdAt             = timSystime;

            jdbcManager.updateBySqlFile(
                    "data/insertUser.sql",
                    param)
                    .execute();
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * ユーザー情報更新を行う
     * @throws Exception
     */
    private void updateRegInfo() throws Exception{
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // 当日取得
            Calendar cal = Calendar.getInstance();
            // プロパティの値を変更
            //            user.mailAddress = this.emailAddress;
            user.password              = MakeHash.getSha256HashCode(this.password);
            user.passwordUpdateAt      = new Timestamp(cal.getTime().getTime());
            user.firstName             = this.firstName;
            user.lastName              = this.lastName;
            user.region                = this.region;
            user.company               = this.company;
            user.department            = this.department;
            user.phone                 = this.phone;
            user.country               = this.country;
            user.city                  = this.city;

            user.updatedAt             = new Timestamp(cal.getTime().getTime());
            user.updatedBy             = user.userID;
            // 更新
            jdbcManager.update(user).includes("password"
                    ,"passwordUpdateAt"
                    ,"firstName"
                    ,"lastName"
                    ,"region"
                    ,"company"
                    ,"department"
                    ,"phone"
                    ,"country"
                    ,"city"
                    ,"updatedAt"
                    ,"updatedBy"
                    ).execute()
                    ;
            return;
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * 存在チェック処理
     * @return 存在チェック結果(0:仮、1:本、2:データ存在しない)
     * @throws Exception エラー
     */
    public String checkUserPresence( ) throws Exception {
        String strflg = "2";  // 初期化：データ存在しない

        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // 検索条件
            SimpleWhere swh = new SimpleWhere().eq("mailAddress", this.emailAddress)
                    .eq("deleteFlag", "0");

            // 一覧取得
            User user = jdbcManager.from(User.class)
                    .where(swh)
                    .getSingleResult()
                    ;
            if(user != null){
                strflg = user.userIDFlag;
                this.user = user;
                this.userID = user.userID;
            }

        }catch(Exception e){
            throw e;
        }
        return strflg;
    }

    /**
     * ユーザーID取得処理
     * @throws Exception エラー
     */
    public void getUserIdSequence( ) throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        jdbcManager.updateBySqlFile(
                "data/updUserSequence.sql")
                .execute();

        // ユーザーID取得
        this.userID = jdbcManager.selectBySql(String.class
                ,"SELECT lpad(LAST_INSERT_ID(),7,'0')")
                .getSingleResult()
                ;

    }

    /**
     * メール送信処理
     * @return 処理結果
     * @throws Exception エラー
     */
    public Boolean mailSend( ) throws Exception {
        boolean successFlag = false;
        try {
            // メール本文に記載する正式登録用URLを組み立てる
            // URLの形式：https://xxx.xxx.xx.xx/FFSA/?reg=(ユーザIDとパスワード更新日時を連結してSHA1ハッシュ化した値)
            // ハッシュ値を取得
            CommonService commonService = new CommonService();
            User user = commonService.getUserInfo(userID);
            String passwordUpdateAt = new SimpleDateFormat("yyyyMMddHHmmss").format(user.passwordUpdateAt);
            String registerParameter = userID + passwordUpdateAt;
            String hashedRegisterParameter = MakeHash.getSha1HashCode(registerParameter);
            // アプリケーションのルートURLを取得
            String rootUrl = MessageResourcesUtil.getMessage("root_url");
            String registerUrl = rootUrl + "csas/csas105/?reg=" + hashedRegisterParameter;

            // メール情報をセット
            SendMaiMail sendMaiMail = new SendMaiMail();

            // 送信元メールアドレス(From)
            String mailAddressFrom = MessageResourcesUtil.getMessage("mail_address_from");
            sendMaiMail.setMailAddressFrom(mailAddressFrom);

            // 送信先メールアドレス(To)
            MailAddress[] sendMailAddressTo = new MailAddress[1];
            sendMailAddressTo[0] = new MailAddress(emailAddress,"");

            sendMaiMail.setMailAddressTo(sendMailAddressTo);

            sendMaiMail.setReplacementItem1(registerUrl);

            sendMaiMail.setReplacementSubject("");
            // 送信
            successFlag = sendMaiMail.sendMail(ConstantValue.infoRegMail);

            if(!successFlag){
                this.errorCode = "csas501.902";
                return false;
            }

        }catch(MailSendException m){
            return false;
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        return true;

    }

    /**
     * メールアドレスをセットする
     * @param emailAddress
     */
    public void setEmailAddress(String emailAddress){this.emailAddress = emailAddress;}
    /**
     * FirstNameをセットする
     * @param firstName
     */
    public void setFirstName(String firstName){this.firstName = firstName;}
    /**
     * LastNameをセットする
     * @param firstName
     */
    public void setLastName(String lastName){this.lastName = lastName;}
    /**
     * Passwordをセットする
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }
    /**
     * Companyをセットする
     * @param company
     */
    public void setCompany(String company) {
        this.company = company;
    }
    /**
     * Departmentをセットする
     * @param department
     */
    public void setDepartment(String department) {
        this.department = department;
    }
    /**
     * Phoneをセットする
     * @param phone
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }
    /**
     * Regionをセットする
     * @param region
     */
    public void setRegion(String region) {
        this.region = region;
    }
    /**
     * Countryをセットする
     * @param country
     */
    public void setCountry(String country) {
        this.country = country;
    }
    /**
     * Cityをセットする
     * @param city
     */
    public void setCity(String city) {
        this.city = city;
    }
    /**
     * メールアドレスを取得する
     * @return emailAddress
     */
    public String getEmailAddress(){return this.emailAddress;}
    /**
     * FirstNameを取得する
     * @return firstName
     */
    public String getFirstName(){return this.firstName;}
    /**
     * LastNameを取得する
     * @return lastName
     */
    public String getLastName(){return this.lastName;}
    /**
     * ユーザーIDを取得する
     * @return userID
     */
    public String getUserID(){return this.userID;}
    /**
     * passwordを取得する
     * @return password
     */
    public String getPassword() {
        return password;
    }
    /**
     * companyを取得する
     * @return company
     */
    public String getCompany() {
        return company;
    }
    /**
     * departmentを取得する
     * @return department
     */
    public String getDepartment() {
        return department;
    }
    /**
     * regionを取得する
     * @param region
     */
    public String getRegion() {
        return region;
    }
    /**
     * phoneを取得する
     * @return phone
     */
    public String getPhone() {
        return phone;
    }
    /**
     * countryを取得する
     * @return country
     */
    public String getCountry() {
        return country;
    }
    /**
     * cityを取得する
     * @return city
     */
    public String getCity() {
        return city;
    }
    /**
     * 入力チェックエラーコードを取得する
     * @return errorCode
     */
    public String getErrorCode(){
        return this.errorCode;
    }

}
